<?php

/**
 * 获取其他网站接口数据
 */
function sendCurl($url, $body = [], $type = "GET" , $header = [])
{
    //1.创建一个curl资源
    $ch = curl_init();
    //2.设置URL和相应的选项
    curl_setopt($ch, CURLOPT_URL, $url);//设置url
    //1)设置请求头
    array_push($header, 'Accept:application/json');
    array_push($header,'Content-Type:application/json');
    array_push($header, 'http:multipart/form-data');
    //设置为false,只会获得响应的正文(true的话会连响应头一并获取到)
    curl_setopt($ch, CURLOPT_HEADER, 0);
    // 设置超时限制防止死循环
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    //设置发起连接前的等待时间，如果设置为0，则无限等待。
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    //将curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //2)设备请求体
    if (count($body) > 0) {
        //$b=json_encode($body,true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));//全部数据使用HTTP协议中的"POST"操作来发送。
    }
    //设置请求头
    if (count($header) > 0) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    }
    //3)设置提交方式
    switch (strtoupper($type)) {
        case "GET":
            curl_setopt($ch, CURLOPT_HTTPGET, true);
            break;
        case "POST":
            curl_setopt($ch, CURLOPT_POST, true);
            break;
        case "PUT"://使用一个自定义的请求信息来代替"GET"或"HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTT
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
            break;
        case "DELETE":
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
            break;
    }
    //3.抓取URL并把它传递给浏览器
    $res = curl_exec($ch);
    $result = json_decode($res, true);
    //4.关闭curl资源，并且释放系统资源
    curl_close($ch);

    return $res;
}

/**
 * 根据给定概率返回数组中的某一元素
 * @param $elem_prob array 候选样本及相应概率，概率最小粒度0.0001，若所有概率加起来不等于1，则按各元素权重比例计算概率
 * @return 数组中的某一元素，若样本格式不规范则返回false
 * @author vision
 */
function getRandomElement($elem_prob)
{
    $elems = array_map(function ($val) {
        return intval($val * 10000);
    }, $elem_prob);
    $prob_sum = array_sum($elems);
    foreach ($elems as $elem => $prob) {
        if (mt_rand(1, $prob_sum) <= $prob) {
            return $elem;
        } else {
            $prob_sum -= $prob;
        }
    }

    return false;
}
